Micron Document
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| SparkN0de-git | SparkN0de |
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


Commit 4dfd42391528aa203e0263ebd78007f7cfa3b56c


Parents : 60591d3
Author : Mark Qvist <mark@unsigned.io>
Date : 2025-01-18T19:12:08+01:00

Added ability to cancel outbound messages

Changes

3 files changed, 84 insertions(+), 6 deletions(-)


Diff

diff --git a/sbapp/sideband/core.py b/sbapp/sideband/core.py
index f6d922fa..2ae73d13 100644
--- a/sbapp/sideband/core.py
+++ b/sbapp/sideband/core.py
@@ -1868,6 +1868,10 @@ class SidebandCore():
image=args["image"],
audio=args["audio"])
connection.send(send_result)
+ elif "cancel_message" in call:
+ args = call["cancel_message"]
+ cancel_result = self.cancel_message(args["message_id"])
+ connection.send(cancel_result)
elif "send_command" in call:
args = call["send_command"]
send_result = self.send_command(
@@ -4273,6 +4277,21 @@ class SidebandCore():
RNS.log("An error occurred while getting message transfer stamp cost: "+str(e), RNS.LOG_ERROR)
return None
+ def _service_cancel_message(self, message_id):
+ if not RNS.vendor.platformutils.is_android():
+ return False
+ else:
+ if self.is_client:
+ try:
+ return self.service_rpc_request({"cancel_message": {"message_id": message_id }})
+
+ except Exception as e:
+ RNS.log("Error while cancelling message over RPC: "+str(e), RNS.LOG_DEBUG)
+ RNS.trace_exception(e)
+ return False
+ else:
+ return False
+
def _service_send_message(self, content, destination_hash, propagation, skip_fields=False, no_display=False, attachment = None, image = None, audio = None):
if not RNS.vendor.platformutils.is_android():
return False
@@ -4316,6 +4335,26 @@ class SidebandCore():
else:
return False
+ def cancel_message(self, message_id):
+ if self.allow_service_dispatch and self.is_client:
+ try:
+ return self._service_cancel_message(message_id)
+
+ except Exception as e:
+ RNS.log("Error while cancelling message: "+str(e), RNS.LOG_ERROR)
+ RNS.trace_exception(e)
+ return False
+
+ else:
+ try:
+ self.message_router.cancel_outbound(message_id)
+ return True
+
+ except Exception as e:
+ RNS.log("Error while cancelling message: "+str(e), RNS.LOG_ERROR)
+ RNS.trace_exception(e)
+ return False
+
def send_message(self, content, destination_hash, propagation, skip_fields=False, no_display=False, attachment = None, image = None, audio = None):
if self.allow_service_dispatch and self.is_client:
try:

diff --git a/sbapp/ui/helpers.py b/sbapp/ui/helpers.py
index 80d2971c..c3b454cb 100644
--- a/sbapp/ui/helpers.py
+++ b/sbapp/ui/helpers.py
@@ -20,11 +20,13 @@ color_delivered = "Blue"
color_paper = "Indigo"
color_propagated = "Indigo"
color_failed = "Red"
+color_cancelled = "Red"
color_unknown = "Gray"
intensity_msgs_dark = "800"
intensity_msgs_light = "500"
intensity_play_dark = "600"
intensity_play_light = "300"
+intensity_cancelled = "900"
intensity_msgs_dark_alt = "800"
@@ -38,6 +40,7 @@ color_paper_alt = "DeepPurple"
color_playing_alt = "Amber"
color_failed_alt = "Red"
color_unknown_alt = "Gray"
+color_cancelled_alt = "Red"
class ContentNavigationDrawer(Screen):
pass

diff --git a/sbapp/ui/messages.py b/sbapp/ui/messages.py
index 08093cf9..5486f5c8 100644
--- a/sbapp/ui/messages.py
+++ b/sbapp/ui/messages.py
@@ -34,14 +34,14 @@ if RNS.vendor.platformutils.get_platform() == "android":
import plyer
from sideband.sense import Telemeter, Commands
from ui.helpers import ts_format, file_ts_format, mdc
- from ui.helpers import color_playing, color_received, color_delivered, color_propagated, color_paper, color_failed, color_unknown, intensity_msgs_dark, intensity_msgs_light, intensity_play_dark, intensity_play_light
- from ui.helpers import color_received_alt, color_received_alt_light, color_delivered_alt, color_propagated_alt, color_paper_alt, color_failed_alt, color_unknown_alt, color_playing_alt, intensity_msgs_dark_alt, intensity_msgs_light_alt, intensity_delivered_alt_dark
+ from ui.helpers import color_playing, color_received, color_delivered, color_propagated, color_paper, color_failed, color_unknown, intensity_msgs_dark, intensity_msgs_light, intensity_play_dark, intensity_play_light, color_cancelled, intensity_cancelled
+ from ui.helpers import color_received_alt, color_received_alt_light, color_delivered_alt, color_propagated_alt, color_paper_alt, color_failed_alt, color_unknown_alt, color_playing_alt, intensity_msgs_dark_alt, intensity_msgs_light_alt, intensity_delivered_alt_dark, color_cancelled_alt
else:
import sbapp.plyer as plyer
from sbapp.sideband.sense import Telemeter, Commands
from .helpers import ts_format, file_ts_format, mdc
- from .helpers import color_playing, color_received, color_delivered, color_propagated, color_paper, color_failed, color_unknown, intensity_msgs_dark, intensity_msgs_light, intensity_play_dark, intensity_play_light
- from .helpers import color_received_alt, color_received_alt_light, color_delivered_alt, color_propagated_alt, color_paper_alt, color_failed_alt, color_unknown_alt, color_playing_alt, intensity_msgs_dark_alt, intensity_msgs_light_alt, intensity_delivered_alt_dark
+ from .helpers import color_playing, color_received, color_delivered, color_propagated, color_paper, color_failed, color_unknown, intensity_msgs_dark, intensity_msgs_light, intensity_play_dark, intensity_play_light, color_cancelled, intensity_cancelled
+ from .helpers import color_received_alt, color_received_alt_light, color_delivered_alt, color_propagated_alt, color_paper_alt, color_failed_alt, color_unknown_alt, color_playing_alt, intensity_msgs_dark_alt, intensity_msgs_light_alt, intensity_delivered_alt_dark, color_cancelled_alt
if RNS.vendor.platformutils.is_darwin():
from PIL import Image as PilImage
@@ -213,6 +213,7 @@ class Messages():
c_paper = color_paper_alt
c_unknown = color_unknown_alt
c_failed = color_failed_alt
+ c_cancelled = color_cancelled_alt
else:
c_delivered = color_delivered
c_received = color_received
@@ -221,6 +222,7 @@ class Messages():
c_paper = color_paper
c_unknown = color_unknown
c_failed = color_failed
+ c_cancelled = color_cancelled
for new_message in self.app.sideband.list_messages(self.context_dest, after=self.latest_message_timestamp,limit=limit):
self.new_messages.append(new_message)
@@ -369,7 +371,7 @@ class Messages():
m["state"] = msg["state"]
if msg["state"] == LXMF.LXMessage.FAILED:
- w.md_bg_color = msg_color = mdc(c_failed, intensity_msgs)
+ w.md_bg_color = msg_color = mdc(c_failed, intensity_cancelled)
txstr = time.strftime(ts_format, time.localtime(msg["sent"]))
titlestr = ""
if msg["title"]:
@@ -381,6 +383,19 @@ class Messages():
w.heading += f"\n[b]Audio Message[/b] ({alstr})"
w.dmenu.items.append(w.dmenu.retry_item)
+ if msg["state"] == LXMF.LXMessage.CANCELLED:
+ w.md_bg_color = msg_color = mdc(c_cancelled, intensity_cancelled)
+ txstr = time.strftime(ts_format, time.localtime(msg["sent"]))
+ titlestr = ""
+ if msg["title"]:
+ titlestr = "[b]Title[/b] "+msg["title"].decode("utf-8")+"\n"
+ w.heading = titlestr+"[b]Sent[/b] "+txstr+"\n[b]State[/b] Cancelled"
+ m["state"] = msg["state"]
+ if w.has_audio:
+ alstr = RNS.prettysize(w.audio_size)
+ w.heading += f"\n[b]Audio Message[/b] ({alstr})"
+ w.dmenu.items.append(w.dmenu.retry_item)
+
def hide_widget(self, wid, dohide=True):
if hasattr(wid, 'saved_attrs'):
@@ -427,6 +442,7 @@ class Messages():
c_paper = color_paper_alt
c_unknown = color_unknown_alt
c_failed = color_failed_alt
+ c_cancelled = color_cancelled_alt
else:
c_delivered = color_delivered
c_received = color_received
@@ -435,6 +451,7 @@ class Messages():
c_paper = color_paper
c_unknown = color_unknown
c_failed = color_failed
+ c_cancelled = color_cancelled
self.ids.message_text.font_name = self.app.input_font
@@ -602,9 +619,13 @@ class Messages():
heading_str = titlestr+"[b]Created[/b] "+txstr+"\n[b]State[/b] Paper Message"
elif m["state"] == LXMF.LXMessage.FAILED:
- msg_color = mdc(c_failed, intensity_msgs)
+ msg_color = mdc(c_failed, intensity_cancelled)
heading_str = titlestr+"[b]Sent[/b] "+txstr+"\n[b]State[/b] Failed"
+ elif m["state"] == LXMF.LXMessage.CANCELLED:
+ msg_color = mdc(c_cancelled, intensity_cancelled)
+ heading_str = titlestr+"[b]Sent[/b] "+txstr+"\n[b]State[/b] Cancelled"
+
elif m["state"] == LXMF.LXMessage.OUTBOUND or m["state"] == LXMF.LXMessage.SENDING:
msg_color = mdc(c_unknown, intensity_msgs)
heading_str = titlestr+"[b]Sent[/b] "+txstr+"\n[b]State[/b] Sending "
@@ -798,6 +819,13 @@ class Messages():
return x
+ def gen_cancel(mhash, item):
+ def x():
+ self.app.sideband.cancel_message(mhash)
+ item.dmenu.dismiss()
+
+ return x
+
def gen_save_image(item):
if RNS.vendor.platformutils.is_android():
def x():
@@ -1197,6 +1225,14 @@ class Messages():
"on_release": gen_save_attachment(item)
}
dm_items.append(extra_item)
+ if m["state"] <= LXMF.LXMessage.SENT:
+ extra_item = {
+ "viewclass": "OneLineListItem",
+ "text": "Cancel message",
+ "height": dp(40),
+ "on_release": gen_cancel(m["hash"], item)
+ }
+ dm_items.append(extra_item)
item.dmenu = MDDropdownMenu(
caller=item.ids.msg_submenu,


──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────